#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程 
        //死循环跑不完，但是代码出现异常了，进程收到信号，信号终止了子进程，父进程就要知道
        while(1)
        {
            printf("我是子进程，我的PID : %d, 我的PPID : %d\n", getpid(), getppid());

              sleep(1);
            
              //野指针问题
//            int* p = NULL;
//            *p = 100;
//
//            int a = 10;
//            a /= 0;
        }

        exit(111);
    }
    else if(id > 0)
    {
        //父进程
        printf("我是父进程，我的PID : %d, 我的PPID : %d\n", getpid(), getppid());

        int status = 0;

        //-1是等待任意进程，哪个退出就回收哪一个
        pid_t ret = waitpid(-1, &status, 0);
        if(ret > 0)
        {
            //用宏直接提取
            //检测子进程退出是否正常退出
            //if(WIFEXITED(status)) printf("等待成功 : exit code : %d\n", WEXITSTATUS(status));

            //用位操作
            printf("等待成功, %d, exit sig : %d, exit code : %d\n", ret, status&0x007F, (status&0xFF00) >> 8);
        }
    }
    else 
    {
        //do nothing 
        
    }
    
    return 0;
}
